package controller

import (
	"doctor_api_backend/config"
	"doctor_api_backend/models"
	"net/http"

	"github.com/gin-gonic/gin"
)

// 创建入院通知单,入院通知单编码唯一

func CreateAdmissionNotice(c *gin.Context) {
	// 获取请求参数
	admissionNoticeCode := c.Param("admission_notice_code")
	if admissionNoticeCode == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院通知单编码不能为空"})
		return
	}

	// 入院通知单编码唯一
	var existingAdmissionNotice models.AdmissionNotice
	if err := config.DB.Where("admission_notice_code = ?", admissionNoticeCode).First(&existingAdmissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院通知单编码已存在"})
		return
	}

	var admissionNotice models.AdmissionNotice
	if err := c.ShouldBindJSON(&admissionNotice); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 创建入院通知单
	config.DB.Create(&admissionNotice)

	// 返回创建成功信息
	c.JSON(http.StatusOK, gin.H{"message": "入院通知单创建成功"})
}

// 通过入院通知单编码查询入院通知单
func GetAdmissionNoticeByCode(c *gin.Context) {
	// 获取请求参数
	admissionNoticeCode := c.Param("admission_notice_code")
	if admissionNoticeCode == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院通知单编码不能为空"})
		return
	}

	// 通过入院通知单编码查询入院通知单
	var admissionNotice models.AdmissionNotice
	if err := config.DB.Where("admission_notice_code = ?", admissionNoticeCode).First(&admissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院通知单编码不存在"})
		return
	}

	// 返回查询结果
	c.JSON(http.StatusOK, admissionNotice)
}

// 通过入院通知单编码更新入院通知单
func UpdateAdmissionNoticeByCode(c *gin.Context) {
	// 获取请求参数
	admissionNoticeCode := c.Param("admission_notice_code")
	if admissionNoticeCode == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院通知单编码不能为空"})
		return
	}

	// 通过入院通知单编码更新入院通知单
	var admissionNotice models.AdmissionNotice
	if err := c.ShouldBindJSON(&admissionNotice); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 更新入院通知单
	config.DB.Model(&models.AdmissionNotice{}).Where("admission_notice_code = ?", admissionNoticeCode).Updates(admissionNotice)

	// 返回更新成功信息
	c.JSON(http.StatusOK, gin.H{"message": "入院通知单更新成功"})
}

// 通过入院通知单编码删除入院通知单,找到admission_notice_code才删除成功，否者打印删除失败，不存在
func DeleteAdmissionNoticeByCode(c *gin.Context) {
	// 获取请求参数
	admissionNoticeCode := c.Param("admission_notice_code")
	if admissionNoticeCode == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院通知单编码不能为空"})
		return
	}

	// 通过入院通知单编码删除入院通知单
	var admissionNotice models.AdmissionNotice
	if err := config.DB.Where("admission_notice_code = ?", admissionNoticeCode).First(&admissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院通知单编码不存在"})
		return
	}

	config.DB.Where("admission_notice_code = ?", admissionNoticeCode).Delete(&models.AdmissionNotice{})

	// 返回删除成功信息
	c.JSON(http.StatusOK, gin.H{"message": "入院通知单删除成功"})
}

// 通过患者ID查询入院通知单
func GetAdmissionNoticeByPatientID(c *gin.Context) {
	// 获取请求参数
	patientID := c.Param("patient_id")
	if patientID == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "患者ID不能为空"})
		return
	}

	// 通过患者ID查询入院通知单
	var admissionNotice models.AdmissionNotice
	if err := config.DB.Where("patient_id = ?", patientID).First(&admissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "患者ID不存在"})
		return
	}

	// 返回查询结果
	c.JSON(http.StatusOK, admissionNotice)
}

// 通过医生ID查询入院通知单
func GetAdmissionNoticeByDoctorID(c *gin.Context) {
	// 获取请求参数
	doctorID := c.Param("doctor_id")
	if doctorID == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "医生ID不能为空"})
		return
	}

	// 通过医生ID查询入院通知单
	var admissionNotice models.AdmissionNotice
	if err := config.DB.Where("doctor_id = ?", doctorID).First(&admissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "医生ID不存在"})
		return
	}

	// 返回查询结果
	c.JSON(http.StatusOK, admissionNotice)
}

// 通过入院日期查询入院通知单
func GetAdmissionNoticeByAdmissionDate(c *gin.Context) {
	// 获取请求参数
	admissionDate := c.Param("admission_date")
	if admissionDate == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院日期不能为空"})
		return
	}

	// 通过入院日期查询入院通知单
	var admissionNotice models.AdmissionNotice
	if err := config.DB.Where("admission_date = ?", admissionDate).First(&admissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院日期不存在"})
		return
	}

	// 返回查询结果
	c.JSON(http.StatusOK, admissionNotice)
}

// 通过入院科室查询入院通知单
func GetAdmissionNoticeByAdmissionDepartment(c *gin.Context) {
	// 获取请求参数
	admissionDepartment := c.Param("admission_department")
	if admissionDepartment == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院科室不能为空"})
		return
	}

	// 通过入院科室查询入院通知单
	var admissionNotice models.AdmissionNotice
	if err := config.DB.Where("admission_department = ?", admissionDepartment).First(&admissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院科室不存在"})
		return
	}

	// 返回查询结果
	c.JSON(http.StatusOK, admissionNotice)
}

// 通过入院诊断查询入院通知单
func GetAdmissionNoticeByAdmissionDiagnosis(c *gin.Context) {
	// 获取请求参数
	admissionDiagnosis := c.Param("admission_diagnosis")
	if admissionDiagnosis == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院诊断不能为空"})
		return
	}

	// 通过入院诊断查询入院通知单
	var admissionNotice models.AdmissionNotice
	if err := config.DB.Where("admission_diagnosis = ?", admissionDiagnosis).First(&admissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院诊断不存在"})
		return
	}

	// 返回查询结果
	c.JSON(http.StatusOK, admissionNotice)
}

// 通过入院诊断编码查询入院通知单
func GetAdmissionNoticeByAdmissionDiagnosisCode(c *gin.Context) {
	// 获取请求参数
	admissionDiagnosisCode := c.Param("admission_diagnosis_code")
	if admissionDiagnosisCode == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院诊断编码不能为空"})
		return
	}

	// 通过入院诊断编码查询入院通知单
	var admissionNotice models.AdmissionNotice
	if err := config.DB.Where("admission_diagnosis_code = ?", admissionDiagnosisCode).First(&admissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院诊断编码不存在"})
		return
	}

	// 返回查询结果
	c.JSON(http.StatusOK, admissionNotice)
}

// 通过入院通知书内容查询入院通知单
func GetAdmissionNoticeByAdmissionNoticeContent(c *gin.Context) {
	// 获取请求参数
	admissionNoticeContent := c.Param("admission_notice_content")
	if admissionNoticeContent == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院通知书内容不能为空"})
		return
	}

	// 通过入院通知书内容查询入院通知单
	var admissionNotice models.AdmissionNotice
	if err := config.DB.Where("admission_notice_content = ?", admissionNoticeContent).First(&admissionNotice).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "入院通知书内容不存在"})
		return
	}

	// 返回查询结果
	c.JSON(http.StatusOK, admissionNotice)
}
